<header>
    基础类型
</header>
<p>
    和JS相比，TS最大的区别就是其规范了定义的变量的类型，使得程序在运行前就可以在语法层面来判断传递的数据类型是否是合法的等。
</p>
<h2>
    布尔值
</h2>
<pre tag="javascript">let isDone: boolean = true;</pre>
<h2>
    数字
</h2>
<p>
    所有数字都是浮点数，这些浮点数的类型是
    <span class="important">number</span>
    ， 除了支持十进制和十六进制字面量，TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量。
</p>
<h3>
    十进制
</h3>
<pre tag="javascript">let decLiteral: number = 6;</pre>
<h3>
    十六进制
</h3>
<pre tag="javascript">let hexLiteral: number = 0xf00d;</pre>
<h3>
    二进制
</h3>
<pre tag="javascript">let binaryLiteral: number = 0b1010;</pre>
<h3>
    八进制
</h3>
<pre tag="javascript">let octalLiteral: number = 0o744;</pre>
<h2>
    字符串
</h2>
<p>
    可以使用双引号（ "）或单引号（'）表示字符串。
</p>
<pre tag="javascript">let projectName: string = "notebook";</pre>
<h2>
    数组
</h2>
<pre tag="javascript">let list: number[] = [1, 2, 3];</pre>
<p>
    或
</p>
<pre tag="javascript">let list: Array&lt;number&gt; = [1, 2, 3];</pre>
<h2>
    元组 Tuple
</h2>
<p>
    元组类型允许表示一个已知元素数量和类型的数组，各元素的类型不必相同。
</p>
<pre tag="javascript">let x: [string, number] = ['hello', 10];</pre>
<h2>
    枚举
</h2>
<p>
    <span class="important">enum</span>
    类型是对JavaScript标准数据类型的一个补充。
</p>
<h3>
    基础使用
</h3>
<pre tag="javascript">
enum Color {
    Red, 
    Green, 
    Blue
}
let color: Color = Color.Green;
</pre>
<p>
    上面color的值是1，默认情况下，从0开始为元素编号。
</p>
<p>
    当然，你也可以手动修改：
</p>
<pre tag="javascript">enum Color {Red = 1, Green, Blue}</pre>
<p>
    或者，全部都采用手动赋值：
</p>
<pre tag="javascript">enum Color {Red = 2, Green = 4, Blue = 10}</pre>
<h3>
    非数字编号
</h3>
<pre tag="javascript">enum Color { Red = "#f00", Green = "#0f0", Blue = '#00f' }</pre>
<p class="warn">
    温馨提示：此时，必须全部都采用手动赋值。
</p>
<p>
    此时，Color.Green的值就是字符串"#0f0"。
</p>
<h2>
    Any
</h2>
<p>
    有时候，你无法确定一个变量的类型的时候，那么我们可以使用
    <span class="important">any</span>
    类型来标记这些变量：
</p>
<pre tag="javascript">let myValue: any;</pre>
<h2>
    Void
</h2>
<p>
    声明一个
    <span class="important">void</span>
    类型的变量没有什么大用，因为你只能为它赋予undefined和null，一般我们在定义一个函数没有返回值的时候会使用：
</p>
<pre tag="javascript">
function doit(): void {
    console.log("这个函数不会有返回值");
}
</pre>
<h2>
    Null 和 Undefined
</h2>
<p>
    本身的意义也不是很大，记住一点：默认情况下
    <span class="important">null</span>
    和
    <span class="important">undefined</span>
    是所有类型的子类型，就是说你可以把null和undefined赋值给任意类型的变量。
</p>
<h3>
    strictNullChecks
</h3>
<p>
    如果你修改了ts的配置，比如在tsconfig.json中：
</p>
<pre tag="javascript">
{
    compilerOptions:{
        "strictNullChecks": true
    }
}
</pre>
<p>
    上述开启了严格的空值类型检查，那么null和undefined只能赋值给void和它们各自。
</p>
<h2>
    Never
</h2>
<p>
    表示的是那些永不存在的值的类型，比如一定抛出错误或死循环函数的返回值。下面是个例子：
</p>
<pre tag="javascript">
function error(message: string): never {
    throw new Error(message);
}
</pre>
<h2>
    Object
</h2>
<p>
    <span class="important">object</span>
    表示非原始类型，也就是除number，string，boolean，symbol，null或undefined之外的类型。
</p>